package keer.httpinterface.utils;

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;

/**
 * 用于数组、集合和Map的常用操作。
 *
 * @author Keer
 * @since 1.0.0
 */
@SuppressWarnings("rawtypes")
public final class CollectionUtils {
    private CollectionUtils() {
        // Utility class should not be instantiated
    }

    /**
     * 检查给定的集合是否为空或null
     * 此方法提供了一个统一的接口来判断集合是否为空，既考虑了null的情况，也考虑了集合内部无元素的情况
     * 使用此方法可以避免直接调用集合的isEmpty方法可能导致的NullPointerException
     *
     * @param collection 要检查的集合，可以是任何实现了Collection接口的集合实例
     * @return 如果集合为null或集合内部没有元素，则返回true；否则返回false
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 检查给定的Map对象是否为空
     * <p>
     * 此方法用于判断指定的Map对象是否为null或者是否为空
     * 它提供了一种简便的方式来同时检查这两种情况
     *
     * @param map 待检查的Map对象，可以是任何实现了Map接口的实例
     * @return 如果map为null或者map为空，则返回true；否则返回false
     */
    public static boolean isEmpty(Map map) {
        return map == null || map.isEmpty();
    }

    /**
     * 检查对象数组是否为空
     * 此方法用于判断给定的对象数组是否为空，即数组为null或长度为0
     * 它提供了一种统一的方式来检查空数组，避免直接调用可能引起NullPointerException的方法
     *
     * @param array 要检查的对象数组，可以为任意类型的数组
     * @return 如果数组为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(Object[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查整型数组是否为空或长度为零
     * 此方法用于判断给定的整型数组是否为空或者不包含任何元素，
     * 主要用于在进行数组操作之前进行前置条件检查，以避免空指针异常或数组越界异常
     *
     * @param array 可能为空的整型数组
     * @return 如果数组为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(int[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查给定的长整型数组是否为空
     *
     * @param array 需要检查的长整型数组
     * @return 如果数组为空或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(long[] array) {
        // 检查数组是否为null或长度是否为0，以确定数组是否为空
        return array == null || array.length == 0;
    }

    /**
     * 判断短整型数组是否为空
     * 此方法用于检查传入的短整型数组是否为null或长度是否为0
     * 它常用于在进行数组操作之前，验证数组是否为空，以避免空指针异常
     *
     * @param array 可能为空的短整型数组
     * @return 如果数组为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(short[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查给定的字节数组是否为空或长度为零
     * 此方法用于判断字节数组是否为空，避免空指针异常或处理空数据
     *
     * @param array 要检查的字节数组
     * @return 如果字节数组为空或长度为零，则返回true；否则返回false
     */
    public static boolean isEmpty(byte[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查字符数组是否为空或长度为零
     * 此方法用于判断给定的字符数组是否为空或者没有任何元素
     * 它首先检查数组是否为null，然后检查数组的长度是否为0
     * 这种检查方式避免了空指针异常的发生，提高了代码的健壮性
     *
     * @param array 要检查的字符数组
     * @return 如果数组为空或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(char[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查浮点数数组是否为空
     * 此方法用于确定给定的浮点数数组是否为空或者为null，适用于在进行数组处理之前快速检查数组的有效性
     *
     * @param array 要检查的浮点数数组
     * @return 如果数组为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(float[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 检查double类型的数组是否为空
     * 此方法用于判断给定的double类型数组是否为null或空数组
     * 它常用于在进行数组处理前，确保数组不为空，以避免空指针异常或数组越界异常
     *
     * @param array 待检查的double类型数组
     * @return 如果数组为null或长度为0，则返回true；否则返回false
     */
    public static boolean isEmpty(double[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 比较两个对象数组是否相等
     *
     * @param a 第一个对象数组
     * @param b 第二个对象数组
     * @return 如果两个数组相等，则返回true；否则返回false
     */
    public static boolean equals(Object[] a, Object[] b) {
        return Arrays.equals(a, b);
    }

    /**
     * 比较两个整数数组是否相等
     * 使用Arrays类的equals方法进行比较，该方法比较两个数组的长度以及每个元素是否相等
     * 如果两个数组长度相同，并且对应位置的元素相等，则认为两个数组相等
     *
     * @param a 第一个整数数组
     * @param b 第二个整数数组
     * @return 如果两个数组相等，则返回true；否则返回false
     */
    public static boolean equals(int[] a, int[] b) {
        return Arrays.equals(a, b);
    }

    /**
     * 比较两个long型数组是否相等
     * 使用Arrays类的equals方法进行比较，该方法逐个比较数组中的元素
     * 如果两个数组的长度相同，并且每个对应位置的元素都相等，则认为两个数组相等
     *
     * @param a 第一个long型数组
     * @param b 第二个long型数组
     * @return 如果两个数组相等，则返回true；否则返回false
     */
    public static boolean equals(long[] a, long[] b) {
        return Arrays.equals(a, b);
    }

    /**
     * 比较两个short数组是否相等
     * 使用Arrays类的equals方法进行比较，该方法逐个比较数组中的元素
     * 如果两个数组长度相同且对应位置的元素完全相等，则认为两个数组相等
     * 此方法注释遵循了函数级别块注释的要求，解释了参数、返回值和方法的目的
     *
     * @param a 第一个short数组
     * @param b 第二个short数组
     * @return 如果两个数组相等返回true，否则返回false
     */
    public static boolean equals(short[] a, short[] b) {
        return Arrays.equals(a, b);
    }
}

